using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using AccesoDatos;
using Entidades;

namespace Negocio.Negocio
{
    // Clase de negocio
    internal class Venta
    {
        // Devuelve el listado de comisiones del vendedor
        public DataTable ListarComisionVendedor(string apellidoVendedor, string tipoComision)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                // Seteo de valores por defecto para los valores numericos
                if (tipoComision == "")
                {
                    tipoComision = "-1";
                }

                Object[,] parmSP = { 
                        {"@apellidoVendedor", SqlDbType.VarChar, 30, apellidoVendedor},
                        {"@tipoComision", SqlDbType.Int, 3, tipoComision}
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_ComisionVendedor", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("listaComisionVendedor() - " + ex.Message);
            }
        }

        //Inserta una nueva comision para el vendedor
        public bool InsertarComisionVendedor(Entidades.ComisionVendedor comisionVendedor/*int codigoVendedor, int codigoTipoComision, int porcentajeComision*/)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codVendedor", SqlDbType.Int, 8, comisionVendedor.CodigoVendedor}, 
                        {"@codComision", SqlDbType.Int, 8, comisionVendedor.TipoComision},
                        {"@porcComision", SqlDbType.Int, 8, comisionVendedor.Valor}
                };
                return oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_INS_ComisionVendedor", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("insertaComisionVendedor() - " + ex.Message);
            }
        }

        //Actualiza el porcentaje de la comision para el vendedor
        public bool ActualizarComisionVendedor(Entidades.ComisionVendedor comisionVendedor)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codVendedor", SqlDbType.Int, 8, comisionVendedor.CodigoVendedor}, 
                        {"@codComision", SqlDbType.Int, 8, comisionVendedor.TipoComision},
                        {"@porcComision", SqlDbType.Int, 8, comisionVendedor.Valor}
                };
                return oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_UPD_ComisionVendedor", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("actualizarComisionVendedor() - " + ex.Message);
            }
        }

        // Devuelve el listado de los tipos de comision
        public DataTable ListarTipoComision()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoComision");
            }
            catch (Exception ex)
            {
                throw new Exception("listarComisionVendedor() - " + ex.Message);
            }
        }

        // Devuelve el listado de los vendedores
        public DataTable ListarVendedor(int codigoVendedor, String nombreVendedor)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codigoVendedor", SqlDbType.Int, 5, codigoVendedor},
                        {"@nombreVendedor", SqlDbType.VarChar, 50, nombreVendedor}
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_Vendedor", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("listarVendedor() - " + ex.Message);
            }
        }

        public bool EliminarComisionVendedor(Entidades.ComisionVendedor comisionVendedor)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codVendedor", SqlDbType.Int, 8, comisionVendedor.CodigoVendedor}, 
                        {"@codComision", SqlDbType.Int, 8, comisionVendedor.TipoComision}
                };
                return oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_DEL_ComisionVendedor", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("eliminarComisionVendedor() - " + ex.Message);
            }
        }

        // Devuelve el listado de los estados de las ventas
        public DataTable ListaEstadoVenta(int item)
        {
            try
            {
                 SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@item", SqlDbType.Int, 5, item}
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_EstadoVenta", parmSP);

            }
            catch (Exception ex)
            {
                throw new Exception("listaEstadoVenta() - " + ex.Message);
            }
        }

        public DataTable ListaTipoServicioAdicional()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoServicioAdicional");

            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoServicioAdicional() - " + ex.Message);
            }
        }

        public DataTable ListaTipoEvento()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();


                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoEvento");

            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoEvento() - " + ex.Message);
            }
        }

        public DataTable ListaPaquete()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_Paquete");

            }
            catch (Exception ex)
            {
                throw new Exception("listaPaquete() - " + ex.Message);
            }
        }

        public DataTable ListaSala()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_Sala");

            }
            catch (Exception ex)
            {
                throw new Exception("listaSala() - " + ex.Message);
            }
        }

        public DataTable montoPorPaquete(int codigoPaquete)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codigoPaquete", SqlDbType.Int, 4, codigoPaquete}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_MontoPaquete", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("montoPorPaquete() - " + ex.Message);
            }
        }

        //Lista Tipo Habitacion
        public DataTable listarTipoHabitacion()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoHabitacion");
            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoHabitacion() - " + ex.Message);
            }
        }

        //Inserta un nuevo tipo de habitacion
        public bool InsertarTipoHabitacion(Entidades.TipoHabitacion tipoHabitacion)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codTipoHabitacion", SqlDbType.Int, 8, tipoHabitacion.CodigoTipoHabitacion}, 
                        {"@descripcion", SqlDbType.VarChar, 20, tipoHabitacion.DescripcionPromocion},
                       };
                return oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_INS_TipoHabitacion", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("insertaTipoHabitacion() - " + ex.Message);
            }
        }

        //Actualizar tipo de habitacion
        public bool ActualizarTipoHabitacion(Entidades.TipoHabitacion tipoHabitacion)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codTipoHabitacion", SqlDbType.Int, 8, tipoHabitacion.CodigoTipoHabitacion}, 
                        {"@descripcion", SqlDbType.VarChar, 20, tipoHabitacion.DescripcionPromocion}
                       };
                return oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_UPD_TipoHabitacion", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("actualizarTipoHabitacion() - " + ex.Message);
            }
        }

        public DataTable ListaServicioExtra()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_ServicioExtra");

            }
            catch (Exception ex)
            {
                throw new Exception("ListaServicioExtra() - " + ex.Message);
            }
        }

        public DataTable MontoPorServicio(int codigoServicio)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codigoServicio", SqlDbType.Int, 4, codigoServicio}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_MontoServicio", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("montoPorServicio() - " + ex.Message);
            }
        }

        public DataTable CodigoServicio(string nombreServicio)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@nombreServicio", SqlDbType.VarChar, 30, nombreServicio}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_CodigoServicio", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("codigoServicio() - " + ex.Message);
            }
        }

        // Inserta la cabecera de la venta
        public DataTable InsertaVenta(string fechaVenta, string personaContacto, decimal subTotalVenta, decimal impuestoVenta,
            decimal totalTotalVenta, string estado, int codigoVendedor, int codigoCliente, int codigoPromocion, int tipoVenta,
            int tipoPago, int tipoTarjetaCredito, string numeroTarjetaCredito, int codProgramaFidelizacion, decimal montoPromocion,
            decimal montoDescuento)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                {"@fechaVenta", SqlDbType.Char, 8, fechaVenta},
                {"@personaContacto", SqlDbType.VarChar, 30, personaContacto},
                {"@subTotalVenta", SqlDbType.Decimal, 15, subTotalVenta},
                {"@impuestoVenta", SqlDbType.Decimal, 15, impuestoVenta},
                {"@totalTotalVenta", SqlDbType.Decimal, 15, totalTotalVenta},
                {"@estado", SqlDbType.Char, 1, estado},
                {"@codigoVendedor", SqlDbType.Int, 4, codigoVendedor},
                {"@codigoCliente", SqlDbType.Int, 4, codigoCliente},
                {"@codigoPromocion", SqlDbType.Int, 4, codigoPromocion},
                {"@tipoVenta", SqlDbType.Int, 4, tipoVenta},
                {"@tipoPago", SqlDbType.Int, 4, tipoPago},
                {"@tipoTarjetaCredito", SqlDbType.Int, 4, tipoTarjetaCredito},
                {"@numeroTarjetaCredito", SqlDbType.VarChar, 15, numeroTarjetaCredito},
                {"@codProgramaFidelizacion", SqlDbType.Int, 4, codProgramaFidelizacion},
                {"@montoPromocion", SqlDbType.Decimal, 15, montoPromocion},
                {"@montoDescuento", SqlDbType.Decimal, 15, montoDescuento},
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_INS_Venta", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("InsertaVenta() - " + ex.Message);
            }
        }

        // Devuelve el ranking de ventas
        public DataTable ListaRankingVentas(int codigoVendedor, String fechaInicial, String fechaFinal)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                {"@codigoVendedor", SqlDbType.Int, 4, codigoVendedor},
                {"@fechaIni", SqlDbType.Char, 8, fechaInicial},
                {"@fechaFin", SqlDbType.Char, 8, fechaFinal}
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_RankingVenta", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("insertaVenta() - " + ex.Message);
            }
        }

    }
}